﻿@page "/es/5.8/software-configuration/using-formulas"
@{
    Layout = "_ArticleLayout";
    ViewBag.Title = "Uso de fórmulas";
}

<nav class="doc-toc">
    <div class="h6">En esta página</div>
    <hr>
    <ul>
        <li><a href="#formula-rules">Reglas para escribir fórmulas</a></li>
        <li><a href="#existing-formulas">Fórmulas existentes</a></li>
        <li><a href="#debugging-formulas">Depuración de fórmulas</a></li>
    </ul>
</nav>

<div class="doc-content">
    <h1>Uso de fórmulas</h1>

    <p>Las fórmulas se usan para calcular los valores y los estados de los canales de entrada, así como para calcular los valores de los comandos. El procesamiento de las fórmulas es realizada por la aplicación Server (Servidor).</p>

    <p>Las fórmulas se ingresan en la columna <em>Formula</em> de las tablas <em>Input channels (Canales de entrada)</em> y <em>Output Channels (Canales de salida)</em> de la base de datos de configuración. Para habilitar una fórmula, marque la casilla en la columna <em>Formula used (Fórmula utilizada)</em>. La tabla <em>Formulas</em> contiene funciones adicionales y estructuras de datos que pueden utilizarse en las fórmulas para los canales de entrada y salida.</p>

    <h2 id="formula-rules">Reglas para escribir fórmulas</h2>

    <p>Las reglas generales de escritura y uso de fórmulas son:</p>

    <ol>
        <li>Las fórmulas usan <a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/" target="_blank">la sintaxis de expresiones del lenguaje C#</a>. Muchas de las clases Microsoft .NET están accesibles, por ejemplo, las clases Math y DateTime.</li>
        <li>Es posible añadir nuevas constantes, campos, propiedades y métodos para usarlos en las fórmulas.</li>
        <li>Si al menos una fórmula contiene un error, la operación del Servidor será imposible y el sistema se tranca! La información sobre errores en las fórmulas se escribe en el registro (log) de la aplicación Servidor.</li>
    </ol>

    <p>Reglas para calcular fórmulas para los canales de entrada:</p>

    <ol>
        <li>Los canales de los tipos <em>Discrete </em>y <em>Real </em>se calculan cuando el Servidor recibe los datos de canales. Utilice estos tipos de canales cuando la fórmula no se refiera a datos de otros canales.</li>
        <li>Los canales de los tipos <em>Calculated *</em> y <em>Switching counter</em> se calculan permanentmente en el orden correspondiente a los números de los canales. La fórmula de un canal calculado utiliza generalmente datos de otros canales.</li>
        <li>Los canales de los tipos<em> Minute *</em> y <em>Hourly *</em> sse calculan periódicamente, una vez por minuto o una vez por hora. Utilice estos tipos de canales para crear valores acumulados, por ejemplo, consumo de energía o tiempo de funcionamiento.</li>
        <li>Para los canales de los tipos <em>Discrete </em>y <em>Real </em>, los estados de los canales tras del cálculo son iguales a los estados de esos canales recibidos por el Servidor, si el cálculo del estado no lo especifica explícitamente.</li>
        <li>Los estados de los otros tipos de canales son marcados como <em>Defined </em>si el cálculo del estado no lo especifica explícitamente.</li>
        <li>Cuando la fórmula de un canal de entrada, no contiene el símbolo ";" (punto y coma), la fórmula calcula solamente el valor del canal de entrada.</li>
        <li>Si la fórmula de un canal de entrada contiene ";", la fórmula calcula el valor del canal de entrada y el estado. La primera parte antes del punto y coma es la fórmula para calcular un valor y la segunda parte, después de punto y coma, calcula el estado.</li>
        <li>Si se especifican límites a un canal, el estado del canal es recalculado tomando en cuenta los límites después de haber calculado la fórmula del canal.</li>
        <li>La fórmula para calcular el valor de un canal debe devolver un número real del tipo  <em>double</em>, y la fórmula para calcular el estado, devuelve un número entero del tipo <em>int</em>.</li>
    </ol>

    <p>Reglas para calcular fórmulas para los canales de salida:</p>

    <ol>
        <li>Las fórmulas para los canales de salida se procesan utilizando los tipos de comando <em>Standard </em>y <em>Binary</em>.</li>
        <li>Una fórmula para calcular el valor de un comando estándar debe devolver un número real del tipo <em>double</em>, y la fórmula para calcular datos de un comando binario devuelve una matriz de bytes del tipo  <em>byte[ ]</em>.</li>
    </ol>

    <h2 id="existing-formulas">Fórmulas existentes</h2>

    <p>Los variables accesibles en las fórmulas son:</p>

    <table class="table table-hover">
        <thead>
            <tr>
                <th>Variable</th>
                <th>Tipo de valor</th>
                <th>Descripción</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>CnlVal, Cnl</td>
                <td>double</td>
                <td>El valor del canal de entrada transmitido al Servidor antes del cálculo</td>
            </tr>
            <tr>
                <td>CnlStat</td>
                <td>int</td>
                <td>El estado del canal de entrada transmitido al Servidor antes del cálculo</td>
            </tr>
            <tr>
                <td>CmdVal, Cmd</td>
                <td>double</td>
                <td>El valor del comando transmitido al Servidor antes del cálculo</td>
            </tr>
            <tr>
                <td>CmdData</td>
                <td>byte[]</td>
                <td>Los datos del comando transmitidos al Servidor antes del cálculo</td>
            </tr>
            <tr>
                <td>CnlNum</td>
                <td>int</td>
                <td>El número de canal para el cual se calcula la fórmula</td>
            </tr>
            <tr>
                <td>E</td>
                <td>double</td>
                <td>La base de un logaritmo natural especificada por la constante e</td>
            </tr>
            <tr>
                <td>PI</td>
                <td>double</td>
                <td>La relación entre la circunferencia y el diámetro de un círculo especificada por la constante, π</td>
            </tr>
        </tbody>
    </table>

    <p>Funciones accesibles en las fórmulas:</p>

    <table class="table table-hover">
        <thead>
            <tr>
                <th>Función</th>
                <th>Tipo de valor</th>
                <th>Descripción</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>N(n)</td>
                <td>int</td>
                <td>Devuelve el número del canal especificado para actualizar los números al clonar</td>
            </tr>
            <tr>
                <td>Val()</td>
                <td>double</td>
                <td>Obtiene el valor actual del canal de la fórmula</td>
            </tr>
            <tr>
                <td>Val(n)</td>
                <td>double</td>
                <td>Obtiene el valor actual del canal n</td>
            </tr>
            <tr>
                <td>SetVal(n, val)</td>
                <td>double</td>
                <td>Establece el valor actual del canal n</td>
            </tr>
            <tr>
                <td>Stat()</td>
                <td>int</td>
                <td>Obtiene el estado actual del canal de la fórmula</td>
            </tr>
            <tr>
                <td>Stat(n)</td>
                <td>int</td>
                <td>Obtiene el estado actual del canal n</td>
            </tr>
            <tr>
                <td>SetStat(n, stat)</td>
                <td>int</td>
                <td>Establece el estado actual del canal n</td>
            </tr>
            <tr>
                <td>SetData(n, val, stat)</td>
                <td>double</td>
                <td>Establece el valor y el estado actual del canal n</td>
            </tr>
            <tr>
                <td>Abs(x)</td>
                <td>double</td>
                <td>Calcula el valor absoluto de un número</td>
            </tr>
            <tr>
                <td>Sin(x)</td>
                <td>double</td>
                <td>Calcula el seno del ángulo especificado</td>
            </tr>
            <tr>
                <td>Cos(x)</td>
                <td>double</td>
                <td>Calcula el coseno del ángulo especificado</td>
            </tr>
            <tr>
                <td>Tan(x)</td>
                <td>double</td>
                <td>Calcula la tangente del ángulo especificado</td>
            </tr>
            <tr>
                <td>Exp(x)</td>
                <td>double</td>
                <td>Calcula e elevado a la potencia especificada</td>
            </tr>
            <tr>
                <td>Ln(x), Log(x)</td>
                <td>double</td>
                <td>Calcula el logaritmo natural (base e) del número especificado</td>
            </tr>
            <tr>
                <td>Sqr(x)</td>
                <td>double</td>
                <td>Calcula el cuadrado de un número especificado</td>
            </tr>
            <tr>
                <td>Sqrt(x)</td>
                <td>double</td>
                <td>Calcula la raíz cuadrada de un número especificado</td>
            </tr>
        </tbody>
    </table>

    <p>Fórmulas adicionales, incluidas las fórmulas para el calcular promedios, están <a href="https://github.com/RapidScada/scada-community/tree/master/Formulas" target="_blank">disponibles en GitHub</a>.</p>

    <h2 id="debugging-formulas">Depuración de fórmulas</h2>

    <p>Un desarrollador que crea fórmulas personalizadas tiene que verificar la sintaxis de las fórmulas y validar que funcionen correctamente. Si el servicio del Servidor no puede compilar las fórmulas en el inicio, se escribirá información sobre el error en el archivo de registro del Servidor (Server log file) y el código fuente de las fórmulas que el Servidor trata de compilar estará disponible en CalcEngine.cs, ubicado en el directorio de registro del Servidor, por defecto C:\SCADA\ScadaServer\Log\</p>

    <p>Para desarrollar fórmulas complejas se recomienda usar Microsoft Visual Studio Community Edition. Añada una referencia al conjunto FormulaTester.dll en el proyecto. Como ejemplo, utilice el proyecto mencionado anteriormente que contiene fórmulas.</p>
</div>
